import { Record, List } from 'immutable';
import { createFieldList } from './utils';
import generateId from '../../utils/generate-id';

const baseType = {
  string: {
    name: 'string',
    id: 'string'
  },
  number: {
    name: 'number',
    id: 'number'
  },
  datetime: {
    name: 'datetime',
    id: 'datetime'
  }
};

function isBaseType(id) {
  return !!baseType[id];
}

const DEFAULTS = {
  id: undefined,
  name: undefined,
  fields: List()
};

class DataType extends Record(DEFAULTS) {
  static __dataType__ = true;

  static isDataType(object) {
    return !!object.__dataType__;
  }

  static create(attr = {}) {
    if (DataType.isDataType(attr)) {
      return attr;
    }
    const { name, fields = [], id = generateId() } = attr;
    if (isBaseType[id]) {
      return DataType.createBaseType(id);
    }
    return new DataType({ name, fields: createFieldList(fields), id });
  }

  static createBaseType(type) {
    if (!baseType[type]) {
      return;
    }
    return new DataType(baseType[type]);
  }

  static stringType() {
    return new DataType(baseType.string);
  }

  static numberType() {
    return new DataType(baseType.number);
  }

  static datetimeType() {
    return new DataType(baseType.datetime);
  }

  static baseDataTypes() {
    return List(Object.keys(baseType).map(DataType.createBaseType));
  }
}

export default DataType;
